﻿using System.Collections.Generic;
using GigaSite.Domain.Entities;

namespace GigaSite.Domain.Interfaces.Repositories
{
    /// <summary>
    /// Репозиторий объявлений
    /// </summary>
    public interface IAdvsRepository: IBaseRepository<Adv>
    {
        /// <summary>
        /// Получает список только активных объявлений в категории, отсортированных по дате
        /// </summary>
        /// <param name="category">Категория</param>
        /// <returns>коллекция объявлений в указанной категории</returns>
        IEnumerable<Adv> GetActiveAdvsInCategory(Category category);

        /// <summary>
        /// Добавляет изображение к указанному объявлению
        /// </summary>
        /// <param name="ads">Объявление</param>
        /// <param name="image">Изображение</param>
        void AddImageToAdvs(Adv ads, Image image);

        /// <summary>
        /// Получает все объявления в указанной категории а так же во всех ее дочерних подкатегориях
        /// </summary>
        /// <param name="category">Категория</param>
        /// <returns>Коллекция ВСЕХ обяэвлений</returns>
        IEnumerable<Adv> GetAdsInCategoryAndChildCategories(Category category);

        /// <summary>
        /// Возвращает количество объявлений в указанной категории а так же во всех ее дочерних подкатегориях
        /// </summary>
        /// <param name="category">Категория</param>
        /// <returns>Количество объявлений в категории и ее подкатегориях</returns>
        int GetAdsCountInCategoryAndChildCategories(Category category);

        /// <summary>
        /// Добавляет объявление в избранное к пользователю
        /// </summary>
        /// <param name="user">Пользователь</param>
        /// <param name="adv">Объявление</param>
        void AddAdsToUserFavourites(User user, Adv adv);

        /// <summary>
        /// Удаляет объявления из избранного пользователя
        /// </summary>
        /// <param name="user">Пользователь</param>
        /// <param name="adv">Объявление</param>
        void RemoveAdsFromUserFavourites(User user, Adv adv);

        /// <summary>
        /// Получает коллекцию объявлений которые подал указанный пользователь в категории и во всех ее дочерних подкатегориях
        /// </summary>
        /// <param name="category">Категория</param>
        /// <param name="user">Пользователь</param>
        /// <returns>Коллекция объявлений</returns>
        IEnumerable<Adv> GetUserAdsInCategoryAndChildCategories(Category category, User user);

        /// <summary>
        /// Получает количество пользовательских объявлений в категории и во всех ее дочерних подкатегориях
        /// </summary>
        /// <param name="category">Категория</param>
        /// <param name="user">Пользователь</param>
        /// <returns>Количество объявлений которые создал пользовать</returns>
        int GetUserAdsCountInCategoryAndChildCategories(Category category, User user);

        /// <summary>
        /// Получает коллекцию объявлений из избранного пользователя находящегося в указанных категориях а так же во всех вложенных подкатегориях
        /// </summary>
        /// <param name="category">Категория</param>
        /// <param name="user">Пользователь</param>
        /// <returns>Коллекция объявлений</returns>
        IEnumerable<Adv> GetFavouriteUserAdsInCategoryAndChildCategories(Category category, User user);

        /// <summary>
        /// Получает количество объявлений из избранного пользователя, находящегося в указанной категории а так же во всех дочерних подкатегориях
        /// </summary>
        /// <param name="category"></param>
        /// <param name="user"></param>
        /// <returns></returns>
        int GetFavouriteUserAdsCountInCategoryAndChildCategories(Category category, User user);
    }
}